www.gusucode.com > 基于Matlab的MIMO通信系统仿真 含报告;司中威;了解移动通信 > 基于Matlab的MIMO通信系统仿真 含报告;司中威;了解移动通信关键技术,了解数字通信系统仿真流程,实现基本的信道编译码、调制解调等通信模块。(好评如潮,课设拿满) 学习并实现MIMO空时处理技术 学习性能分析的思路和方法/mimo/mimo.m
function tx(nr_frames) % Transmission % Maxime Maury % 05-04-28 if (nargin < 1) nr_frames = 20; % number of frames to send end % Frame structure Type SYNC % Antenna 1: % +---+----------+-----+---+-----+-----------------------------+ % | G | tr_sync1 | tr1 | G | tr1 | data | % +---+----------+-----+---+-----+-----------------------------+ % Antenna 2: % +---+----------+-----+---+-----+-----------------------------+ % | G | tr_sync1 | tr2 | G | tr2 | data | % +---+----------+-----+---+-----+-----------------------------+ % Antenna 1: Type REGULAR % +---+-----+---+-----+-----------------------------+ % | G | tr1 | G | tr1 | data | % +---+-----+---+-----+-----------------------------+ % Antenna 2: % +---+-----+---+-----+-----------------------------+ % | G | tr2 | G | tr2 | data | % +---+-----+---+-----+-----------------------------+ close all disp(' '); disp('-- Start TX --') j = sqrt(-1); % --------------------------------------------------- % General parameters % --------------------------------------------------- Fs = 96000; % Sampling frequency (Hz) Fc = 10000; % Carrier frequency (Hz) L = 10; % Upsampling factor % Simulate a Frequency offset F_offset = 0; % In real frequency Fc_tx = Fc + F_offset; %nr_frames =100; data_len = 256; % In symbolS data_len_bits = data_len*4; % In bits % --------------------------------------------------- % Pulse shape % --------------------------------------------------- pulse = 1; if (pulse==1) roll_off_factor = .22; half_filter_len = 7; % Half-Length of the RRC pulse_shape = root_raised_cosine(L, roll_off_factor, half_filter_len); else pulse_shape = ones(1,L); end pulse_len = length(pulse_shape); % --------------------------------------------------- % Head & tail % --------------------------------------------------- % Add a zero signal for noise estimation init_len = 500; % Add a zero tail tail_len = 2000; % Sinusoid at 10kHz for frequency offset estimation n_periods = 100; time_end = floor(n_periods*Fs/Fc_tx) -1 ; % Stops just before cos = 1 to avoid discontinuities in the signal;打dota,看出装 % (modulation of frames start with cos=1) % --------------------------------------------------- % Guard symbols % --------------------------------------------------- % Guard symbols guard_symbols_I = ones(1, 1); guard_symbols_Q = ones(1, 1); guard_len = length(guard_symbols_I); % --------------------------------------------------- % Training sequence % --------------------------------------------------- % Training sequence [tr_sync1_I, tr_sync1_Q, tr1_I, tr1_Q, tr2_I, tr2_Q] = training_sequence; % Length of channel estimation training sequence training_len = length(tr1_I); % --------------------------------------------------- % Framing % --------------------------------------------------- % Length of synchronization training sequence training_s_len = length(tr_sync1_I); % Length of a regular frame in symbols (before upsampling) frame_len = guard_len + training_len + guard_len + training_len + data_len; overhead_len = frame_len - data_len; disp(['Overhead size (Regular): ', num2str(overhead_len/frame_len*100), '%']); disp(['Overhead size (Sync): ', num2str((overhead_len+training_s_len)/frame_len*100), '%']); % Synchronization every refresh_fr frames refresh_fr = 4; nr_sync_frames = floor((nr_frames-1)/refresh_fr) + 1; nr_regular_frames = nr_frames - nr_sync_frames; disp(['Number of regular frames: ', num2str(nr_regular_frames)]); disp(['Number of sync frames: ', num2str(nr_sync_frames)]); % Length of an upsampled frame pulse-shaped Lf = frame_len * L + pulse_len - 1 ; Lf_sync = Lf + training_s_len*L ; frames_len = Lf*nr_frames + training_s_len*L*nr_sync_frames; % Save all these parameters into tx_param for the receiver save('tx_param'); % --------------------------------------------------- % Data % --------------------------------------------------- % Generate random data stream data_sent = random_data(data_len_bits*2*nr_frames); % For testing, de-comment the following % data_sent(1:2:end) = [ zeros(1,data_len*2*nr_frames), ones(1,data_len*2*nr_frames)]; % data_sent(2:2:end) = [ ones(1,data_len*2*nr_frames), zeros(1,data_len*2*nr_frames)]; % Serial To Parallel % 1 2 3 4 5... -> [1 3 5 ...; 2 4 ...] data_split_sent_1 = data_sent(1:2:end); data_split_sent_2 = data_sent(2:2:end); % channel1 sent to Antenna 1, channel2 sent to Antenna 2 channel1_block = zeros(1 , frames_len); channel2_block = zeros(1 , frames_len); % --------------------------------------------------- % Frame Loop % --------------------------------------------------- % Proceeed frame by frame for fr=1:nr_frames k = 1 + (fr-1)* data_len_bits; % Position within the data bits % Extract data data_split_1 = data_split_sent_1(:,k:k+data_len_bits-1); data_split_2 = data_split_sent_2(:,k:k+data_len_bits-1); % Modulate the data in 16QAM [data1_I,data1_Q] = qam16(data_split_1); [data2_I,data2_Q] = qam16(data_split_2); % Create the frame if (mod(fr-1, refresh_fr) == 0) % Type SYNCH frame1_I = [guard_symbols_I tr_sync1_I tr1_I guard_symbols_I tr1_I data1_I]; frame1_Q = [guard_symbols_Q tr_sync1_Q tr1_Q guard_symbols_Q tr1_Q data1_Q]; frame2_I = [guard_symbols_I tr_sync1_I tr2_I guard_symbols_I tr2_I data2_I]; frame2_Q = [guard_symbols_Q tr_sync1_Q tr2_Q guard_symbols_Q tr2_Q data2_Q]; actual_len = Lf_sync; else % Type REGULAR frame1_I = [guard_symbols_I tr1_I guard_symbols_I tr1_I data1_I]; frame1_Q = [guard_symbols_Q tr1_Q guard_symbols_Q tr1_Q data1_Q]; frame2_I = [guard_symbols_I tr2_I guard_symbols_I tr2_I data2_I]; frame2_Q = [guard_symbols_Q tr2_Q guard_symbols_Q tr2_Q data2_Q]; actual_len = Lf; end % Upsample frame1_I_up = upsample(frame1_I,L); frame1_Q_up = upsample(frame1_Q,L); frame2_I_up = upsample(frame2_I,L); frame2_Q_up = upsample(frame2_Q,L); frame1_I_up = conv(frame1_I_up, pulse_shape); frame1_Q_up = conv(frame1_Q_up, pulse_shape); frame2_I_up = conv(frame2_I_up, pulse_shape); frame2_Q_up = conv(frame2_Q_up, pulse_shape); % Number of previous frames n_fr_sync = floor((fr-2)/refresh_fr) + 1; n_fr_reg = (fr-1) - n_fr_sync; n_out = n_fr_reg * Lf + n_fr_sync * Lf_sync + 1; s = 1; e = s + actual_len - 1; channel1_block(n_out:n_out+actual_len-1) = frame1_I_up(s:e) + j* frame1_Q_up(s:e); channel2_block(n_out:n_out+actual_len-1) = frame2_I_up(s:e) + j* frame2_Q_up(s:e); end % Save the output of the TX save('TXOutput','channel1_block','channel2_block'); % Save data sent f_id = fopen('transmit.dat', 'wb'); fwrite(f_id, data_sent, 'int16'); fclose(f_id); disp('End') figure; Nc = 2; Nr = 2; subplot(Nc,Nr,1) plot(data1_I,data1_Q,'k*') hold on; plot(frame1_I(1:guard_len),frame1_Q(1:guard_len),'rs'); plot(frame1_I(guard_len+1:guard_len+training_s_len),frame1_Q(guard_len+1:guard_len+training_s_len),'g*'); plot(frame1_I(guard_len+training_s_len+1:guard_len+training_s_len+training_len),frame1_Q(guard_len+training_s_len+1:guard_len+training_s_len+training_len),'bp'); grid on; axis([-4 4 -4 4]) axis equal legend('Data','Guard','Sync training seq','Ch estim. trainin seq'); title('Constellation'); subplot(Nc,Nr,2) psd(pulse_shape,2048,Fs,1024,256); title('Pulse Shape Spectrum'); subplot(Nc,Nr,3) plot(real(channel1_block)); hold on; plot(imag(channel1_block),'r'); legend('I','Q'); title('Channel 1'); subplot(Nc,Nr,4) psd(channel1_block,2048,Fs,1024,256); title('Spectrum of Channel 1'); figure; Nc = 2; Nr = 1; subplot(Nc,Nr,1) autocorr1 = abs(xcorr(tr_sync1_I+sqrt(-1)*tr_sync1_Q)); plot( autocorr1 ); hold on; plot(training_s_len,autocorr1(training_s_len),'*r'); title('Autocorrelation of synchronization training sequence 1'); subplot(Nc,Nr,2) cross = abs(xcorr((tr1_I+sqrt(-1)*tr1_Q),(tr2_I+sqrt(-1)*tr2_Q))); plot(cross); title('Crosscorrelation of training sequence 1 and 2'); hold on; plot(training_len,cross(training_len),'*r');